package com.lmy.task.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;


/**
 * 可以自定义线程池来执行定时任务
 * 默认情况下，Spring Task 使用单线程执行任务。
 * 为了提高并发场景下的处理能力，可以通过实现 SchedulingConfigurer 自定义线程池来执行定时任务
 * @Scheduler注解的方法必须是无参数、无返回值的public 方法。且当出现异常时，会导致任务停止执行。
 */
@Configuration
@EnableScheduling
public class SpringTaskConfig implements SchedulingConfigurer {


    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        //设置线程池大小为10。任务可以同时在10个线程中并发执行
        threadPoolTaskScheduler.setPoolSize(10);
        //设置线程的名称前缀。可以更好的监控和调试并识别当前任务所属的线程池
        threadPoolTaskScheduler.setThreadNamePrefix("lmy-scheduled-task-pool");
        threadPoolTaskScheduler.initialize();
        scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
    }
}
